dbtでmodelやsourceのベースとなるコードを自動で生成してくれるpackage「codegen」を試してみた #dbt
さがらです。
dbt Labs社が提供しているdbt packageの1つ、codegenを試してみたので、その内容をまとめてみます。
codegenとは
codegenに関する情報は、下記ページにまとまっております。
このページの概要文を見ると、
Macros that generate dbt code, and log it to the command line.
…ということで、「codegen」という名の通りdbtのコードを生成してくれるmacroがまとまったpackageです。
より具体的には、下記3つのmacroを含むdbt packageです。
generate_source
:sourceを定義するyamlファイルのベースを生成するmacrogenerate_base_model
:modelファイルのベースを生成するmacrogenerate_model_yaml
:modelのスキーマ定義を行うyamlファイルのベースを生成するmacro
codegenのインストール
まず、codegenを対象のdbtプロジェクトに対してインストールします。
dbt_project.yml
と同じ階層に、packages.yml
を定義し、以下の内容を記述します。すでにpackages.yml
がある場合は、下記の内容の- package:
以降を追記してください。
packages: - package: dbt-labs/codegen version: 0.7.0
このpackages.yml
の編集と保存後に、dbt deps
コマンドを実行します。これでcodegenが使えるようになりました!
試してみた
では早速、codegenに含まれるmacroを試してみた内容を書いていきます!
それぞれのmacroを、dbt run-operation
の形でdbt Cloudのコマンドラインから実行してみます。
generate_source
まずは、generate_source
です。これはsourceを定義するyamlファイルのベースを生成するmacroです。
引数にスキーマ名だけを指定して実行すると、スキーマ名がname
として記述されたsourceのベースとなるコードがログに出力されます。
dbt run-operation generate_source --args 'schema_name: citibike'
一方で、スキーマ名に加えてデータベース名とテーブル名も引数に指定して実行すると、データベース名がdatabase
として、テーブル名がtables
として記述されたコードがログに出力されます。
dbt run-operation generate_source --args '{"schema_name": "CITIBIKE", "database_name": "SAGARA_RAWDATA_DB", "table_names":["STATIONS", "TRIPS"]}'
generate_base_model
続いて、generate_base_model
です。こちらは、sourceを指定してmodel用のSELECT文を生成してくれるmacroです。
generate_base_model
を使うには、sourceを事前に定義しておく必要があります。
せっかくなので、先程generate_source
で出力されたsourceのコードを用いて、generate_base_model
を使っていきます。
generate_base_model
は、コマンドラインで下記のように入力して実行することで、対象のsourceのテーブルのカラムを全て選択したSELECT文がログに出力されます。
dbt run-operation generate_base_model --args '{"source_name": "citibike", "table_name": "trips"}'
generate_model_yaml
最後に3つ目、generate_model_yaml
です、これは、modelのスキーマ定義を行うyamlファイルのベースを生成するmacroです。
generate_model_yaml
を使うには、modelを事前に定義しておく必要があります。
先程generate_base_model
で生成したmodelを用いて、generate_model_yaml
を実行してみます。
generate_model_yaml
は、コマンドラインで下記のように入力して実行することで、対象のmodelのスキーマ定義がされたyaml形式のコードがログに出力されます。(事前に対象のmodelに対してdbt run
を行って、オブジェクトを生成していないとエラーとなるためご注意ください。)
dbt run-operation generate_model_yaml --args '{"model_name": "stg_trips"}'
最後に
dbtでmodelやsourceのベースとなるコードを自動で生成してくれるpackage「codegen」を試してみました。
こういったコードをハンド入力しようとすると、結構時間がかかってしまったり、半角スペースを入れ忘れてエラーになってしまう、といったことが考えられます。そのため、こういったpackageを使って楽に自動化できるところは自動化するべきだと思います!
packageは他にも色々とありますので、dbtでの開発中に何か不便に感じることがあればpackageを探して有効活用していきましょう!